# 识别关键区域 regions = { 'product_info': self._find_by_keywords(ws, ['产品名称', '产品编码', '流程号']),
cost_table': self._find_table_by_headers(ws, ['序号', '产品名称', '材料描述', '用量']),
summary': self._find_by_keywords(ws, ['合计', '总成本', '基准价格']),
'process_params': self._find_by_keywords(ws, ['模穴数', '单重', '材料利用率']) } wb.close() return regions
这段代码是用于从Excel工作表中识别不同区域的关键部分。具体来说,它通过关键词或表头来定位Excel中的四个主要区域:产品基本信息、成本明细表、汇总区域和工艺参数区域。
详细解释如下:
1. regions 是一个字典,用于存储识别出的四个区域的位置和信息。
2. 'product_info'(产品基本信息):
通过关键词查找,使用 _find_by_keywords 方法,在工作表中搜索包含'产品名称'、'产品编码'、'流程号'的单元格,并记录这些关键词所在的位置和对应的值。
3. 'cost_table'(成本明细表):
通过表头识别,使用 _find_table_by_headers 方法,查找包含特定表头('序号', '产品名称', '材料描述', '用量')的表格。一旦找到这些表头,就认为该行是成本明细表的表头,并返回表头所在行、列映射以及数据开始行。
4. 'summary'(汇总区域):
通过关键词查找,使用 _find_by_keywords 方法,在工作表中搜索包含'合计'、'总成本'、'基准价格'的单元格,并记录这些关键词所在的位置和对应的值。
5. 'process_params'(工艺参数区域):
通过关键词查找,使用 _find_by_keywords 方法,在工作表中搜索包含'模穴数'、'单重'、'材料利用率'的单元格,并记录这些关键词所在的位置和对应的值。
6. wb.close() 关闭工作簿,释放资源。
7. 返回 regions 字典,其中包含了每个区域的位置和信息。
这样,通过识别这些关键区域,程序就可以知道在Excel的哪些位置可以找到所需的数据,进而进行数据提取。
注意:这些方法(如 _find_by_keywords 和 _find_table_by_headers)是自定义的,它们会遍历工作表的行和列来定位关键词和表头。
这段代码是智能区域识别系统的核心部分,让我详细解释每一行:
代码功能概述
python
# 识别关键区域
regions = {
'product_info': self._find_by_keywords(ws, ['产品名称', '产品编码', '流程号']),
'cost_table': self._find_table_by_headers(ws, ['序号', '产品名称', '材料描述', '用量']),
'summary': self._find_by_keywords(ws, ['合计', '总成本', '基准价格']),
'process_params': self._find_by_keywords(ws, ['模穴数', '单重', '材料利用率'])
}
详细分解
1. regions 字典结构
python
regions = {
'product_info': ...,
'cost_table': ...,
'summary': ...,
'process_params': ...
}
作用:创建一个字典来存储识别出的四个关键数据区域,每个区域对应Excel表格中的一个数据块。
2. 产品信息区域 (product_info)
python
'product_info': self._find_by_keywords(ws, ['产品名称', '产品编码', '流程号'])
关键词:产品名称, 产品编码, 流程号
搜索逻辑:
在工作表ws中扫描前50行×30列的区域
寻找包含上述关键词的单元格
当找到"产品名称"时,记录其位置和右侧/下方的实际产品名称值
当找到"产品编码"时,记录其位置和产品编码值
当找到"流程号"时,记录其位置和流程号值
返回数据结构:
python
{
'产品名称': {
'position': (行号, 列号), # 如 (3, 2)
'value': 'SMT 弹片 不锈钢 镍底2μm Min...' # 实际产品名称
},
'产品编码': {
'position': (行号, 列号), # 如 (3, 11)
'value': '19163055-01' # 实际产品编码
},
'流程号': {
'position': (行号, 列号), # 如 (2, 17)
'value': '202509280379' # 实际流程号
}
}
3. 成本明细表区域 (cost_table)
python
'cost_table': self._find_table_by_headers(ws, ['序号', '产品名称', '材料描述', '用量'])
表头关键词:序号, 产品名称, 材料描述, 用量
搜索逻辑:
寻找包含这些表头关键词的行
识别表格的起始位置(表头行)
映射各列的位置(哪一列是"序号",哪一列是"材料描述"等)
确定数据行的开始位置(通常是表头行的下一行)
返回数据结构:
python
{
'header_row': 5, # 表头所在行号
'columns': {
'序号': 1, # "序号"在第1列
'产品名称': 2, # "产品名称"在第2列
'材料描述': 6, # "材料描述"在第6列
'用量': 11 # "用量"在第11列
},
'data_start': 6 # 数据从第6行开始
}
4. 汇总区域 (summary)
python
'summary': self._find_by_keywords(ws, ['合计', '总成本', '基准价格'])
关键词:合计, 总成本, 基准价格
搜索逻辑:
寻找包含"合计"关键词的行(通常是汇总行)
在汇总行中查找"总成本"、"基准价格"等关键指标
记录这些指标的值和位置
实际应用:
当找到"合计"行时,程序知道这是数据汇总区域
在"合计"行中查找"总成本"列,获取总成本数值
在"合计"行中查找"基准价格"列,获取基准价格数值
5. 工艺参数区域 (process_params)
python
'process_params': self._find_by_keywords(ws, ['模穴数', '单重', '材料利用率'])
关键词:模穴数, 单重, 材料利用率
搜索逻辑:
寻找冲压、注塑等工艺的技术参数区域
识别工艺参数表格的位置
记录关键工艺参数的值
对应Excel中的区域:
text
产品代码 | 模穴数 | 单重(G) | 毛重(G) | 材料利用率 | ...
19167036 | 1 | 0.162 | 0.162 | =D14/E14 | ...
6. 工作簿关闭
python
wb.close()
作用:关闭Excel工作簿,释放系统资源,避免文件被占用。
实际工作流程示例
假设处理您的 bbb.xlsx 文件:
1. 扫描产品信息:
在第3行第2列找到"产品名称",右侧是实际产品名称
在第3行第11列找到"产品编码",右侧是"19163055-01"
在第2行第17列找到"流程号",右侧是"202509280379"
2. 识别成本表格:
在第5行识别到表头:["序号", "产品名称", "产品编码", ..., "用量"]
确定数据从第6行开始
3. 定位汇总行:
在第11行找到"合计",识别这是汇总区域
获取总成本、基准价格等关键数值
4. 找到工艺参数:
在第13行找到工艺参数表头
在第14行获取具体的工艺参数值
为什么这种设计很重要
灵活性
不依赖固定位置,可以处理不同格式的Excel文件
即使表格结构有微小变化,只要关键词存在就能识别
可扩展性
python
# 可以轻松添加新的识别区域
regions = {
'product_info': self._find_by_keywords(ws, ['产品名称', '产品编码', '流程号']),
'cost_table': self._find_table_by_headers(ws, ['序号', '产品名称', '材料描述', '用量']),
'summary': self._find_by_keywords(ws, ['合计', '总成本', '基准价格']),
'process_params': self._find_by_keywords(ws, ['模穴数', '单重', '材料利用率']),
'new_region': self._find_by_keywords(ws, ['新关键词1', '新关键词2']) # 新增区域
}
容错性
即使某些区域缺失,其他区域仍能正常识别
通过多个关键词提高识别准确性
这种设计让系统能够智能地"理解"Excel表格的结构,而不是硬编码位置,这正是处理数千个可能格式略有不同的产品表格所需要的。